package condominios.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominios.excepcion.DAOExcepcion;
import condominios.modelo.Persona;
import condominios.modelo.Ubicacion;
import condominios.modelo.Visita;
import condominios.modelo.Vivienda;
import condominios.util.ConexionBD;
import condominios.util.utilitario;

public class ViviendaDAO extends BaseDAO {

	public Collection<Vivienda> buscarVivienda(Vivienda vivienda) throws DAOExcepcion {
		
		
		String query = "select idVivienda,b.descripUbicacion,v.numero,v.codTipo,p.nombre "
				+ " FROM vivienda v join persona p on v.idPersona=p.idPersona join ubicacion b on v.idUbicacion=b.idUbicacion "
				+ " WHERE v.numero like ? and p.nombre like ?";
		
		Collection<Vivienda> lista = new ArrayList<Vivienda>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			System.out.println(vivienda.getPersona().getNombres() );
			System.out.println(vivienda.getNumero());
			stmt.setString(2, "%"+ vivienda.getPersona().getNombres() +"%");
			stmt.setString(1, "%"+ vivienda.getNumero()+"%");
			
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				System.out.println("hay data");
				Vivienda objVivienda= new Vivienda();
				Persona obPersona= new Persona();
				Ubicacion objUbicacion= new Ubicacion();
				
				//obPersona.setIdPersonaCreo(rs.getInt("idPersona"));
				obPersona.setNombres(rs.getString("nombre"));
				
				//objUbicacion.setIdUbicacion(rs.getInt("idUbicacion"));
				objUbicacion.setDescripcion(rs.getString("descripUbicacion"));
				
				
				objVivienda.setPersona(obPersona);
				objVivienda.setUbicacion(objUbicacion);
				
			
				objVivienda.setNumero(rs.getString("numero"));
				objVivienda.setCodTipo(rs.getInt("codTipo"));
				
				objVivienda.setCodigo(rs.getInt("idVivienda"));
				//objVivienda.setFechaCreo(rs.getTimestamp("fechaCreo"));
				
				lista.add(objVivienda);				
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return lista;
	}
	
	public Collection<Vivienda> buscarTodos() throws DAOExcepcion {
				
		String query = "select idVivienda,v.idPersona,b.descripUbicacion,v.numero,v.codTipo,p.nombre "
				+ " FROM vivienda v join persona p on v.idPersona=p.idPersona join ubicacion b on v.idUbicacion=b.idUbicacion";
				
		
		Collection<Vivienda> lista = new ArrayList<Vivienda>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);			
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				System.out.println("hay data");
				Vivienda objVivienda= new Vivienda();
				Persona obPersona= new Persona();
				Ubicacion objUbicacion= new Ubicacion();
				
				//obPersona.setIdPersonaCreo(rs.getInt("idPersona"));
				obPersona.setNombres(rs.getString("nombre"));
				objVivienda.setIdPersona(rs.getInt("v.idPersona"));
				
				//objUbicacion.setIdUbicacion(rs.getInt("idUbicacion"));
				objUbicacion.setDescripcion(rs.getString("descripUbicacion"));
				
				
				objVivienda.setPersona(obPersona);
				objVivienda.setUbicacion(objUbicacion);
				
			
				objVivienda.setNumero(rs.getString("numero"));
				objVivienda.setCodTipo(rs.getInt("codTipo"));
				
				objVivienda.setCodigo(rs.getInt("idVivienda"));
				//objVivienda.setFechaCreo(rs.getTimestamp("fechaCreo"));
				
				lista.add(objVivienda);				
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return lista;
	}
	
	public Collection<Ubicacion> listarUbicacion() throws DAOExcepcion {

		

		String query = "SELECT * "
				+ " FROM Ubicacion";
				
		
		Collection<Ubicacion> lista = new ArrayList<Ubicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
		
			
			rs = stmt.executeQuery();
			
			while (rs.next()) {

				
				Ubicacion objUbicacion= new Ubicacion();
												
				objUbicacion.setIdUbicacion(rs.getInt("idUbicacion"));
				objUbicacion.setDescripcion(rs.getString("descripUbicacion"));
								
				lista.add(objUbicacion);				
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return lista;
	}




	public void insertar(Vivienda vo) throws DAOExcepcion {
	
	String query = "INSERT INTO vivienda (idVivienda, idPersona, idUbicacion, numero, metraje, codTipo, estado, fechaCreo, idPersonaCreo, fechaRegResidente,estadoRegistro) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
	Connection con = null;
	PreparedStatement stmt = null;
	try {
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		
		stmt.setInt(1, vo.getCodigo());
		stmt.setInt(2, vo.getPersona().getIdPersona());
		stmt.setInt(3, vo.getUbicacion().getIdUbicacion());
		stmt.setString(4, vo.getNumero());
		stmt.setDouble(5, vo.getMetraje());
		stmt.setInt(6, vo.getCodTipo());
		stmt.setInt(7, 1);
		stmt.setString(8, utilitario.fnFechaHoraMySql(vo.getFechaCreo()));
		stmt.setInt(9, vo.getIdPersonaCreo());
		stmt.setString(10, utilitario.fnFechaHoraMySql(vo.getFechaResidente()));
		stmt.setInt(11, 1);
		
		int i = stmt.executeUpdate();
		if (i != 1) {
			throw new SQLException("No se pudo insertar");
		}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void actualizar(Vivienda vo) throws DAOExcepcion {
		
		String query = "update vivienda set idPersona=?, codTipo=?, estado=? where idPersona=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getIdPersona());
			stmt.setInt(2, vo.getCodTipo());
			stmt.setInt(3, vo.getEstado());
			
			stmt.setInt(4, vo.getCodigo());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void eliminar(int idVivienda) throws DAOExcepcion {
		
		String query = "DELETE FROM vivienda WHERE idVivienda=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idVivienda);
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
}
